const PassportBiz = require('../../../../../comm/biz/passport_biz.js');
const pageHelper = require('../../../../../helper/page_helper.js');
const cloudHelper = require('../../../../../helper/cloud_helper.js');
const ProjectBiz = require('../../../biz/project_biz.js');
const QAModel = require('../../../model/qa_model.js');
const setting = require('../../../public/setting.js');

// 导入配置
const AppConfig = require('../../../setting/config.js');

// 确保页面已正确注册
try {
	console.log('[QA] 正在初始化智能问答页面');
} catch (err) {
	console.error('[QA] 页面初始化失败:', err);
}

// 配置后端API地址
const API_BASE_URL = "http://localhost:8000"; // Python后端地址

Page({
	/**
	 * 页面的初始数据
	 */
	data: {
		isLoad: false,
		isLoading: false,
		isShowHistoryLoading: false,
		
		question: '',
		answer: '',
		references: [],
		
		history: [],
		showResult: false,
		
		// 添加预设问题和答案
		demoQuestions: [
			{
				question: '电力系统的主要组成部分有哪些？',
				answer: '电力系统的主要组成部分包括：\n1. 发电系统：由各类发电厂组成，如火力发电厂、水力发电厂、核电厂、风力发电厂、太阳能发电站等。\n2. 输电系统：由各电压等级的输电线路和变电站组成，负责电能的远距离传输。\n3. 配电系统：由配电线路和配电变压器组成，负责向用户分配电能。\n4. 用电系统：各类用电设备和负荷。\n5. 电力系统通信与自动化系统：包括SCADA系统、能量管理系统(EMS)等。\n6. 调度控制系统：负责整个电力系统的安全、经济运行。'
			},
			{
				question: '什么是变压器？它的作用是什么？',
				answer: '变压器是电力系统中的关键设备，是利用电磁感应原理来改变交流电压的静止电气设备。\n\n变压器的主要作用包括：\n1. 电压变换：升高或降低电压，以适应输电、配电和用电的需要。\n2. 电流变换：当电压变化时，电流也相应变化，以保持功率基本不变。\n3. 阻抗变换：使发电、输电、用电等各个环节的阻抗匹配，提高效率。\n4. 电气隔离：提供电气隔离，增强系统安全性。\n5. 相位调整：某些特殊变压器可以调整相位，以满足系统需求。\n\n变压器是电力系统中不可或缺的设备，对于电能的高效传输和使用至关重要。'
			},
			{
				question: '电力系统常见的故障类型有哪些？',
				answer: '电力系统常见的故障类型包括：\n\n1. 短路故障：\n   - 三相短路\n   - 两相短路\n   - 两相接地短路\n   - 单相接地短路\n\n2. 断路故障：\n   - 三相断路\n   - 两相断路\n   - 单相断路\n\n3. 设备故障：\n   - 变压器故障：绕组短路、绝缘击穿、铁芯过热等\n   - 断路器故障：拒动、误动等\n   - 母线故障：母线短路、母线过热等\n   - 线路故障：导线断线、绝缘子闪络等\n\n4. 系统故障：\n   - 频率异常：系统频率过高或过低\n   - 电压异常：系统电压过高或过低\n   - 功角稳定故障：发电机同步失步\n   - 电压稳定故障：系统电压崩溃\n\n这些故障如果处理不当，可能导致设备损坏、系统失稳甚至大面积停电。'
			},
			{
				question: '如何提高电力系统的稳定性？',
				answer: '提高电力系统稳定性的主要措施包括：\n\n1. 加强电网结构：\n   - 建设强大的主干网架\n   - 发展特高压输电技术\n   - 完善区域电网互联\n\n2. 提高发电侧稳定性：\n   - 采用快速励磁系统\n   - 安装发电机功率系统稳定器(PSS)\n   - 提高发电机组的调节性能\n\n3. 优化系统运行方式：\n   - 科学制定电力平衡方案\n   - 合理分配有功和无功潮流\n   - 保持适当的旋转备用容量\n\n4. 应用现代控制技术：\n   - 灵活交流输电系统(FACTS)装置\n   - 高压直流输电(HVDC)技术\n   - 动态无功补偿装置\n\n5. 完善保护与控制系统：\n   - 采用先进的继电保护系统\n   - 实施广域测量系统(WAMS)\n   - 建设智能调度控制系统\n\n6. 强化安全防御措施：\n   - 建立完善的安全预警系统\n   - 制定紧急控制和恢复措施\n   - 定期进行系统稳定性分析\n\n通过以上综合措施，可以有效提高电力系统的角稳定性、频率稳定性和电压稳定性，确保电网安全稳定运行。'
			},
			{
				question: '智能电网的主要特点是什么？',
				answer: '智能电网的主要特点包括：\n\n1. 自愈能力：具备故障自动检测、分析、响应和恢复功能，能够快速隔离故障并重组网络，减少停电范围和时间。\n\n2. 互动性：实现电网与用户的双向互动，用户可以参与电力市场交易，根据电价信号调整用电行为。\n\n3. 兼容性：能够接纳各种类型的发电和储能装置，特别是可再生能源发电，促进分布式能源的接入和利用。\n\n4. 优质电能：提供稳定、可靠、高质量的电能，满足不同用户对电能质量的差异化需求。\n\n5. 资产优化：通过设备状态监测和评估，实现设备维护从计划性转向状态性，提高设备利用率和寿命。\n\n6. 安全性：增强对物理攻击和网络攻击的防御能力，保护关键基础设施的安全。\n\n7. 节能环保：提高能源利用效率，减少电能损耗，降低碳排放，促进可持续发展。\n\n8. 信息化：全面应用现代信息通信技术，实现电力系统的数字化、网络化和智能化。\n\n智能电网是传统电网向数字化、自动化、互动化方向发展的产物，代表了未来电网的发展趋势。'
			}
		]
	},

	// 创建QAModel实例
	_qaModel: null,

	/**
	 * 生命周期函数--监听页面加载
	 */
	onLoad: async function (options) {
		console.log('[QA] 页面开始加载');
		try {
			// 创建QA模型实例
			this._qaModel = new QAModel();
			
			// 项目设置
			ProjectBiz.initPage(this);

			// 添加请求限制计数器
			this._lastRequestTime = 0;
			this._requestCount = 0;
			
			try {
				// 测试后端连接
				await this._testBackendConnection();
				
				// 加载历史记录
				await this._loadRecentHistory();
				
				this.setData({
					isLoad: true
				});
			} catch (err) {
				console.error('页面加载失败:', err);
			} finally {
				console.log('[QA] 页面加载完成，已设置isLoad=true');
			}
			
			// 检查是否存在上下文内容
			if (options && options.content) {
				let question = decodeURIComponent(options.content);
				this.setData({
					question
				});
				this.bindAskTap();
			}
		} catch (err) {
			console.error('[QA] 页面加载过程发生严重错误:', err);
			// 确保设置isLoad为true，避免一直显示加载状态
			this.setData({
				isLoad: true
			});
		}
	},

	/**
	 * 测试后端连接
	 */
	async _testBackendConnection() {
		try {
			// 测试Python后端连接
			await new Promise((resolve, reject) => {
				wx.request({
					url: `${API_BASE_URL}/api/test`, // 调整为您的Python后端测试API路径
					method: 'GET',
					success: res => {
						if (res.statusCode === 200) {
							resolve(res.data);
						} else {
							reject(new Error(`连接测试失败，状态码: ${res.statusCode}`));
						}
					},
					fail: err => {
						reject(err);
					}
				});
			});
			console.log('[QA] 后端连接正常');
		} catch (err) {
			console.warn('[QA] 后端连接失败，将使用本地模式:', err);
			// 尝试云函数连接
			try {
				if (this._qaModel) {
					await this._qaModel.testConnection();
					console.log('[QA] 云函数连接正常，将使用云函数作为备选');
				}
			} catch (cloudErr) {
				console.error('[QA] 云函数连接也失败:', cloudErr);
			}
		}
	},

	/**
	 * 页面相关事件处理函数--监听用户下拉动作
	 */
	onPullDownRefresh: async function () {
		await this._loadRecentHistory();
		wx.stopPullDownRefresh();
	},

	/**
	 * 生命周期函数--监听页面显示
	 */
	onShow: async function () {
		if (this.data.isLoad) {
			await this._loadRecentHistory();
		}
	},

	/**
	 * 输入问题
	 */
	bindInputQuestion: function (e) {
		this.setData({
			question: e.detail.value
		});
	},

	/**
	 * 清空问题
	 */
	bindClearQuestion: function (e) {
		this.setData({
			question: ''
		});
	},

	/**
	 * 发送问题
	 */
	bindAskTap: async function () {
		if (this.data.isLoading) return;
		
		let question = this.data.question.trim();
		if (!question) {
			return pageHelper.showNoneToast('请输入问题');
		}

		try {
			this.setData({ 
				isLoading: true,
				showResult: false 
			});
			
			// 调用Python后端API
			const response = await new Promise((resolve, reject) => {
				wx.request({
					url: `${API_BASE_URL}/api/ask`,
					method: 'POST',
					header: {
						'content-type': 'application/json'
					},
					data: {
						question: question
					},
					success: res => {
						if (res.statusCode === 200) {
							resolve(res.data);
						} else {
							console.error(`API请求失败: 状态码 ${res.statusCode}`, res);
							reject(new Error(`请求失败，状态码: ${res.statusCode}`));
						}
					},
					fail: err => {
						console.error('API请求出错:', err);
						reject(err);
					}
				});
			});

			// 保存到历史记录
			try {
				await cloudHelper.callCloudData('qa/history/add', {
					question: question,
					answer: response.answer,
					references: response.references || []
				});
			} catch (err) {
				console.error('保存历史记录失败:', err);
			}

			this.setData({
				answer: response.answer,
				references: response.references || [],
				isLoading: false,
				showResult: true
			});
		} catch (err) {
			console.error(err);
			this.setData({ 
				isLoading: false,
				showResult: false 
			});
			pageHelper.showModal('系统繁忙，请稍后重试');
		}
	},

	/**
	 * 获取预设问题答案
	 */
	_getDemoAnswer(question) {
		// 规范化问题文本，去除标点和空格，便于匹配
		const normalizedQuestion = question.replace(/[^\u4e00-\u9fa5a-zA-Z0-9]/g, '').toLowerCase();
		
		// 遍历预设问题，查找匹配
		for (const item of this.data.demoQuestions) {
			const normalizedDemoQuestion = item.question.replace(/[^\u4e00-\u9fa5a-zA-Z0-9]/g, '').toLowerCase();
			if (normalizedQuestion === normalizedDemoQuestion || 
				normalizedQuestion.includes(normalizedDemoQuestion) || 
				normalizedDemoQuestion.includes(normalizedQuestion)) {
				return item.answer;
			}
		}
		
		return null;
	},

	/**
	 * 加载最近的历史记录
	 */
	async _loadRecentHistory() {
		try {
			this.setData({
				isShowHistoryLoading: true
			});

			// 尝试从Python后端获取历史记录
			let history = [];
			try {
				// 调用Python后端API获取历史记录
				const response = await new Promise((resolve, reject) => {
					wx.request({
						url: `${API_BASE_URL}/api/history`, // 调整为您的Python后端历史记录API路径
						method: 'GET',
						success: res => {
							if (res.statusCode === 200) {
								resolve(res.data);
							} else {
								reject(new Error(`获取历史记录失败，状态码: ${res.statusCode}`));
							}
						},
						fail: err => {
							reject(err);
						}
					});
				});
				
				console.log('[QA] Python API返回历史记录:', response);
				
				// 处理历史记录数据
				if (response && response.data && Array.isArray(response.data.list)) {
					history = response.data.list;
				} else if (response && Array.isArray(response.list)) {
					history = response.list;
				} else if (response && Array.isArray(response)) {
					history = response;
				}
			} catch (err) {
				console.error('[QA] 从Python获取历史记录失败:', err);
				
				// 尝试从云函数获取历史记录
				try {
					console.log('[QA] 尝试从云函数获取历史记录');
					const result = await cloudHelper.callCloudData('qa/list', {
						size: 5
					});
					
					if (result && result.list) {
						history = result.list;
					} else {
						console.error('[QA] 历史记录返回格式异常:', result);
					}
				} catch (cloudErr) {
					console.error('[QA] 从云函数获取历史记录失败:', cloudErr);
				}
			}
			
			// 格式化历史记录，确保格式统一
			const formattedHistory = history.map(item => {
				// 确保各种可能的数据格式都能正确处理
				return {
					question: item.question || item.content || item.QA_QUESTION || '',
					answer: item.answer || item.QA_ANSWER || '',
					references: item.references || item.QA_REFERENCES || [],
					time: item.time || item.QA_ADD_TIME || Date.now()
				};
			});
			
			// 去重：只保留最新的记录
			const uniqueHistory = [];
			const seenQuestions = new Set();
			
			for (const item of formattedHistory) {
				if (!seenQuestions.has(item.question)) {
					seenQuestions.add(item.question);
					uniqueHistory.push(item);
				}
			}
			
			this.setData({
				history: uniqueHistory.slice(0, 5), // 只显示最新的5条记录
				isShowHistoryLoading: false
			});
			
		} catch (err) {
			console.error('[QA] 加载历史记录错误:', err);
			this.setData({
				isShowHistoryLoading: false
			});
		}
	},

	/**
	 * 查看更多历史记录
	 */
	bindMoreHistory: function() {
		wx.navigateTo({
			url: '../history/qa_history',
		});
	},

	/**
	 * 查询历史记录按钮点击
	 */
	bindHistoryMoreTap: function() {
		// 显示查询中状态
		this.setData({
			isShowHistoryLoading: true
		});

		// 延迟导航，模拟加载
		setTimeout(() => {
			// 隐藏加载状态
			this.setData({
				isShowHistoryLoading: false
			});
			
			// 导航到历史记录页面
			wx.navigateTo({
				url: '../history/qa_history',
			});
		}, 1000);
	},

	/**
	 * 查看历史记录详情
	 */
	bindHistoryDetail: function(e) {
		const id = pageHelper.dataset(e, 'id');
		if (!id) return;

		wx.navigateTo({
			url: '../detail/qa_detail?id=' + id,
		});
	},

	/**
	 * 使用历史问题
	 */
	bindUseHistory: function(e) {
		const question = pageHelper.dataset(e, 'question');
		if (!question) return;

		this.setData({
			question
		});
	},

	/**
	 * 分享
	 */
	onShareAppMessage: function() {
		return {
			title: '电力智能问答助手',
			path: '/projects/repair/pages/qa/index/qa_index'
		}
	},

	/**
	 * 简单延迟函数
	 * @param {number} ms 延迟毫秒数
	 * @returns {Promise} Promise对象
	 */
	_delay: function(ms) {
		return new Promise(resolve => setTimeout(resolve, ms));
	},

	/**
	 * 点击示例问题
	 */
	bindExampleTap: function(e) {
		const question = e.currentTarget.dataset.question;
		if (!question) return;
		
		// 将示例问题填入输入框
		this.setData({
			question: question
		});
		
		// 自动提交问题
		this.bindAskTap();
	},

	/**
	 * 测试API连接
	 */
	async bindTestConnectionTap(e) {
		try {
			wx.showLoading({
				title: '测试连接中...',
				mask: true
			});

			// 获取当前环境
			const envVersion = wx.getAccountInfoSync().miniProgram.envVersion;
			const envInfo = envVersion === 'develop' ? '开发环境' : '体验/正式环境';

			const qaModel = new QAModel();
			const result = await qaModel.testConnection();
			
			wx.hideLoading();
			
			if (result.status) {
				wx.showModal({
					title: '连接测试成功',
					content: `${result.message}\n\n当前环境: ${envInfo}\n访问域名: aip.baidubce.com`,
					showCancel: false
				});
			} else {
				// 提供更详细的错误信息
				let errorTips = '';
				if (envVersion === 'develop') {
					errorTips = '请确认已在开发者工具中勾选"不校验合法域名"选项，并重启开发者工具';
				} else {
					errorTips = '请确认已在微信公众平台添加aip.baidubce.com到request合法域名列表';
				}
				
				wx.showModal({
					title: '连接测试失败',
					content: `${result.message}\n\n当前环境: ${envInfo}\n可能原因:\n1. API密钥错误\n2. ${errorTips}\n3. 请求参数格式不正确`,
					showCancel: false
				});
			}
		} catch (err) {
			wx.hideLoading();
			wx.showModal({
				title: '连接测试异常',
				content: (err.message || '未知错误') + '\n\n请检查网络连接和API配置',
				showCancel: false
			});
		}
	},

	/**
	 * 查询API配额
	 */
	async bindCheckQuotaTap(e) {
		try {
			wx.showLoading({
				title: '查询配额中...',
				mask: true
			});

			const qaModel = new QAModel();
			const result = await qaModel.checkAPIQuota();
			
			wx.hideLoading();
			
			// 获取当前本地使用情况
			const usageInfo = this._getLocalUsage();
			
			// 构建显示消息
			let content = '';
			
			if (result.status) {
				// 配额查询成功
				const quota = result.quota;
				
				if (quota.plan === '免费版') {
					// 免费版用户显示本地统计的使用情况
					content = `账号类型: 百度千帆免费版\n\n` + 
						`今日已使用: ${usageInfo.todayUsed || 0}次\n` +
						`今日剩余: ${50 - (usageInfo.todayUsed || 0)}次(估计值)\n` +
						`免费版QPS限制: 1次/秒\n\n` +
						`注意: 免费版无法精确查询配额，显示数据基于本地统计，仅供参考。\n需要查看准确配额请登录百度千帆平台。`;
				} else {
					// 付费版用户显示API返回的配额情况
					content = `账号类型: ${quota.plan}\n\n` +
						`已使用配额: ${quota.used}次\n` +
						`配额上限: ${quota.available}次\n` +
						`使用百分比: ${(quota.used / quota.available * 100).toFixed(2)}%\n` +
						`每日限额: ${quota.daily}\n\n` +
						`配额状态: ${quota.isExceeded ? '已超额' : '正常'}`;
				}
			} else {
				// 配额查询失败，显示本地统计
				content = `配额查询失败: ${result.message}\n\n` +
					`根据本地统计:\n` +
					`今日已使用: ${usageInfo.todayUsed || 0}次\n` +
					`本周使用情况:\n${this._formatWeeklyUsage(usageInfo.weeklyUsage)}\n\n` +
					`注意: 本地统计数据仅供参考`;
			}
			
			// 显示结果
			wx.showModal({
				title: '百度API配额信息',
				content: content,
				showCancel: false
			});
		} catch (err) {
			wx.hideLoading();
			wx.showModal({
				title: '配额查询异常',
				content: (err.message || '未知错误') + '\n\n请检查网络连接或稍后再试',
				showCancel: false
			});
		}
	},

	/**
	 * 格式化周使用量为易读格式
	 * @private
	 */
	_formatWeeklyUsage(weeklyUsage) {
		if (!weeklyUsage) return '无数据';
		
		return Object.keys(weeklyUsage).map(date => {
			// 转换日期格式为更友好的显示，如 "06-15"
			const friendlyDate = date.substring(5); // 去掉年份部分
			return `${friendlyDate}: ${weeklyUsage[date]}次`;
		}).join('\n');
	},

	/**
	 * 获取本地统计的使用情况
	 * @private
	 */
	_getLocalUsage() {
		try {
			// 尝试获取本地存储的使用次数
			const usageInfo = wx.getStorageSync('qa_api_usage') || {};
			
			// 获取今天的日期作为键
			const today = new Date().toISOString().split('T')[0]; // 格式如 "2023-06-15"
			
			// 获取今天的使用量
			const todayUsed = usageInfo[today] || 0;
			
			// 获取过去7天的使用情况
			const dates = [];
			for (let i = 6; i >= 0; i--) {
				const date = new Date();
				date.setDate(date.getDate() - i);
				dates.push(date.toISOString().split('T')[0]);
			}
			
			// 构建周使用量
			const weeklyUsage = {};
			dates.forEach(date => {
				weeklyUsage[date] = usageInfo[date] || 0;
			});
			
			return {
				todayUsed,
				weeklyUsage
			};
		} catch (err) {
			console.error('[QA] 获取本地使用记录失败:', err);
			return {
				todayUsed: 0,
				weeklyUsage: {}
			};
		}
	}
});